﻿using System;
using System.ComponentModel;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Globalization;

namespace TTApp.Phone.Silverlight.Hexagons
{
    /// <summary>
    /// Chuyển dữ liệu Thickness sang/từ dạng khác.
    /// </summary>
    public class ThicknessConverter : TypeConverter
    {
        #region //----------------------------- Overridden Methods ----------------------------------------//
        /// <summary>
        /// Kiểm tra xem có thể convert từ kiểu sourceType hay không.
        /// </summary>
        /// <param name="context">không biết cái này làm gì @@!</param>
        /// <param name="sourceType"></param>
        /// <returns>true nếu sourceType là kiểu string.</returns>
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
                return true;

            return false;
        }

        /// <summary>
        /// Chuyển từ 1 kiểu bất kì sang kiểu Thickness.
        /// </summary>
        /// <param name="context">Không biết :|</param>
        /// <param name="culture">Không biết :|</param>
        /// <param name="value">Giá trị để convert.</param>
        /// <returns>Đối tượng Thickness nếu convert thành công. Không thì trả về null.</returns>
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            Thickness thickness = default(Thickness);

            string text = value as string;
            string[] digits = text.Split(
                new char[] { ',', ' ' }, 
                StringSplitOptions.RemoveEmptyEntries);
            
            try
            {
                if (digits.Length == 1)
                {
                    thickness.Top = thickness.Left = thickness.Bottom = thickness.Right = Convert.ToDouble(digits[0]);
                }
                else if (digits.Length == 2)
                {
                    thickness.Left = thickness.Right = Convert.ToDouble(digits[0]);
                    thickness.Top = thickness.Bottom = Convert.ToDouble(digits[1]);
                }
                else if (digits.Length == 4)
                {
                    thickness.Left = Convert.ToDouble(digits[0]);
                    thickness.Top = Convert.ToDouble(digits[1]);
                    thickness.Right = Convert.ToDouble(digits[2]);
                    thickness.Bottom = Convert.ToDouble(digits[3]);
                }
                else
                {
                    throw new ArgumentException("Đầu vào nhập không đúng. Nhập giống như Margin/Padding trong XAML");
                }
            }
            catch (Exception ex)
            {
                if (ex is FormatException || ex is OverflowException)
                {
                    throw new ArgumentException("Đầu vào nhập không đúng. Nhập giống như Margin/Padding trong XAML");
                }
                else
                {
                    throw;
                }
            }

            return thickness;
        }
        #endregion
    }
}
